/*
 * All rights Reserved, Designed By cloudland Copyright(C) 2010-2014
 *
 * fileName:  Calendars.java
 * author:  lei
 * Company:  Cloudland Studio
 * Createdate:  2013-9-14 上午9:56:21
 *   
 * Modification  History:
 *     Date           Author        Version        
 * -------------------------------------------
 * 2013-9-14          Lei            1.0        
 *
 * Why & What is modified:
 * 1.0: 文件创建
 */
package org.cloudland.util;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

 /**
 * <pre> 
 * 时间工具类
 * </pre>
 * @ClassName  Calendars
 * @author  lei
 * @version  %I%, %G%
 * @see  
 * @since   JDK1.6
 *
 */
public class Calendars {

	/**
     * DEFAULT_FORMAT 默认的时间格式化字符串
     */
    public final static String DEFAULT_FORMAT = "yyyy-MM-dd hh:mm:ss";
    
    /** 
     * 获取指定格式的格式化对象<br>
     *
     * @param format 指定格式
     * @return 格式化对象
     */
    private static DateFormat getFormat(String format)
    {
        if (null == format || format.length() <= 0 || format.equalsIgnoreCase("null")) 
        {
            throw new RuntimeException("Format String is Null. [" + format + "]");
        }
        return new SimpleDateFormat(format);
    }
    
    /** 
     * 获取指定格式的当前日期字符串。<br>
     * <pre>
     * Calendars.getCurrentlyDate("yyyy-MM-dd");
     * 
     * 结果: 
     * 2013-03-21
     * </pre>
     *
     * @param format 格式化字符串
     * @return 当前日期的格式化字符串
     */
    public static String getCurrentlyDate(String format)
    {
        DateFormat f = getFormat(format);
        return f.format(new Date());
    }
    
    /** 
     * 获取默认的时间格式化字符串结果.<br>
     * <pre>
     * Calendars.getCurrentlyDate();
     * 
     * 结果:
     * 2013-03-21 21:07:33
     * </pre>
     *
     * @return 返回当前的时间格式化后的字符串
     */
    public static String getCurrentlyDate()
    {
        return getCurrentlyDate(DEFAULT_FORMAT);
    }
    
    /** 
     * 将给定的日期格式字符串，按指定的格式转换成时间对象。<br>
     * <pre>
     * Date date = Calendars.getCurrentlyDate("2013-03-13", "yyyy-MM-dd");
     * 
     * </pre>
     *
     * @param date 时间格式的字符串
     * @param format 格式化字符串
     * @return 时间对象
     */
    public static Date getDate(String date, String format)
    {
        DateFormat f = getFormat(format);
        try
        {
            return f.parse(date.trim());
        }
        catch (ParseException e)
        {
            throw new RuntimeException("Transform String to Date process Exception. [date:" + date + ", format:" + format + "]", e);
        }
    }
    
    /** 
     * 将指定日期按指定的格式化字符串转换.<br>
     *
     * @param date 指定日期
     * @param format 格式化字符串
     * @return 日期字符串
     */
    public static String getDate(Date date, String format)
    {
        DateFormat f = getFormat(format);
        return f.format(date);
    }
    
    /** 
     * 将指定日期按默认的格式化字符串转换.<br>
     *
     * @param date 指定的日期
     * @return 日期字符串
     */
    public static String getDate(Date date)
    {
        DateFormat f = getFormat(DEFAULT_FORMAT);
        return f.format(date);
    }
    
    /** 
     * 使用默认的时间格式，将指定的时间字符串转换为时间对象.<br>
     * <pre>
     * Date date = Calendars.getDate("2013-03-29 13:21:56");
     * 
     * </pre>
     *
     * @param date 时间格式字串，格式必须为(yyyy-MM-dd hh:mm:ss)
     * @return 时间对象
     */
    public static Date getDate(String date)
    {
        return getDate(date, DEFAULT_FORMAT);
    }
    
    /** 
     * 判断参照时间，是否在指定开始时间与结束时间之间。如果是，返回 true。<br>
     *
     * @param compare 参照时间
     * @param start 开始时间
     * @param end 结束时间
     * @return 是否在此之间
     */
    public static boolean isBetween(Date compare, Date start, Date end)
    {
        Calendar s = Calendar.getInstance();
        s.setTime(start);
        
        Calendar e = Calendar.getInstance();
        e.setTime(end);
        
        Calendar currently = Calendar.getInstance();
        currently.setTime(new Date());
        if (null != compare) {
            currently.setTime(compare);
        }
        return currently.after(s) && currently.before(e);
    }
    
    /** 
     * 判断当前时间，是否在指定开始时间与结束时间之间。如果是，返回 true。<br>
     *
     * @param start 开始时间
     * @param end 结束时间
     * @return 是否在此之间
     */
    public static boolean isBetween(Date start, Date end)
    {
        return isBetween(null, start, end);
    }
    
    /** 
     * 判断当前时间，是否在指定开始时间与结束时间之间。如果是，返回 true。<br>
     *
     * @param start 开始时间格式字符串
     * @param end 结束时间格式字符串
     * @param format 时间格式串
     * @return 是否在此之间
     */
    public static boolean isBetween(String start, String end, String format)
    {
        Date s = getDate(start, format);
        Date e = getDate(end, format);
        return isBetween(s, e);
    }
    
    /** 
     * 判断参照时间，是否在指定开始时间与结束时间之间。如果是，返回 true。<br>
     * <pre>
     * 如果 参照比对时间为空，则采用当前时间进行比对。
     * 
     * </pre>
     *
     * @param compare 参照比对时间
     * @param start 开始时间格式字符串
     * @param end 结束时间格式字符串
     * @param format 时间格式串
     * @return 是否在此之间
     */
    public static boolean isBetween(String compare, String start, String end, String format)
    {
        Date c = null;
        if (null != compare && compare.length() > 0) {
            c = getDate(compare, format);
        }
        
        Date s = getDate(start, format);
        Date e = getDate(end, format);
        return isBetween(c, s, e);
    }
    
    /** 
     * 使用默认格式将指定时间字符串格式转换为时间格式。<br>
     *
     * @param start 开始时间字符串(格式必须为: yyyy-MM-dd hh:mm:ss)
     * @param end 结束时间字符串(格式必须为: yyyy-MM-dd hh:mm:ss)
     * @return 是否在此之间
     */
    public static boolean isBetween(String start, String end)
    {
        return isBetween(start, end, DEFAULT_FORMAT);
    }
    
    /** 
     * 获取指定日期后给定天数的日期.<br>
     * <pre>
     * Calendars.getDateAfter(new Date(), 3);
     * 
     * 如果当前日期为 2013-03-10，调用方法后，返回的时间为在此时间上加 3 天。
     * 即：2013-03-13
     * </pre>
     *
     * @param date 指定日期
     * @param day 增加的天数
     * @return 日期对象
     */
    public static Date getDateAfter(Date date, int day)
    {
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        
        int dayOfYear = c.get(Calendar.DAY_OF_YEAR);
        c.set(Calendar.DAY_OF_YEAR, dayOfYear + day);
        return c.getTime();
    }
}
